import time
import datetime
import math

'''
    时间工具
    
    python中时间日期格式化符号：
        
        %y 两位数的年份表示（00-99）
        %Y 四位数的年份表示（0000-9999）
        %m 月份（01-12）
        %d 月内中的一天（0-31）
        %H 24小时制小时数（0-23）
        %I 12小时制小时数（01-12）
        %M 分钟数（00=59）
        %S 秒（00-59）
        %a 本地简化星期名称
        %A 本地完整星期名称
        %b 本地简化的月份名称
        %B 本地完整的月份名称
        %c 本地相应的日期表示和时间表示
        %j 年内的一天（001-366）
        %p 本地A.M.或P.M.的等价符
        %U 一年中的星期数（00-53）星期天为星期的开始
        %w 星期（0-6），星期天为星期的开始
        %W 一年中的星期数（00-53）星期一为星期的开始
        %x 本地相应的日期表示
        %X 本地相应的时间表示
        %Z 当前时区的名称
        %% %号本身
'''


class TimeUtil:


    formate1="%Y-%m-%d %H:%M:%S"

    # 获取时间工具
    def get_time(self):
        return time

    # 获取自定义格式的当前日期时间
    def get_current_time_formate(self, formate="%Y-%m-%d %H:%M:%S"):
        return time.strftime(formate, time.localtime())

    # 将格式字符串转为时间戳
    def get_formate_time_to_timestamp(self, datetime="Sat Mar 28 22:24:24 2016", formate="%a %b %d %H:%M:%S %Y"):
        return time.mktime(time.strptime(datetime, formate))

    def last_day_of_month(self, any_day):
        # this will never fail
        next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
        return next_month - datetime.timedelta(days=next_month.day)

    # 获取上月的第一天
    def first_day_of_previous_month(self):
        return datetime.date(datetime.date.today().year, datetime.date.today().month - 1, 1)

    # 获取上月的最后一天
    def last_day_of_previous_month(self):
        return datetime.date(datetime.date.today().year,datetime.date.today().month, 1)-datetime.timedelta(1)

    # 获取当月的第一天
    def first_day_of_current_month(self):
        return datetime.date(datetime.date.today().year, datetime.date.today().month, 1)

    # 获取当月的最后一天
    def last_day_of_current_month(self):
        return datetime.date(datetime.date.today().year, datetime.date.today().month + 1, 1) - datetime.timedelta(1)

    # 获取下月的第一天
    def first_day_of_next_month(self):
        return datetime.date(datetime.date.today().year, datetime.date.today().month + 1, 1)

    # 获取下月的最后一天
    def last_day_of_next_month(self):
        return datetime.date(datetime.date.today().year, datetime.date.today().month + 2, 1) - datetime.timedelta(1)


pass

timeUtil = TimeUtil()
result = time.localtime()
print("获取当前日期元组 ", result)
result = time.time()
print("获取当前时间戳 ", result)
result = timeUtil.get_current_time_formate()
print("获取自定义格式的当前日期时间 ", result)
result = timeUtil.get_formate_time_to_timestamp()
print("将", result)
# 年
year = 2019
# 月
month = 5
# 日
day = 16

result = timeUtil.last_day_of_month(datetime.date(year, month, day))
print("获取指定月份最后一天", result)

result = timeUtil.first_day_of_previous_month()
print("获取上月的第一天", result)
result = timeUtil.last_day_of_previous_month()
print("获取上月的最后一天", result)

result = timeUtil.first_day_of_current_month()
print("获取当月的第一天", result)
result = timeUtil.last_day_of_current_month()
print("获取当月的最后一天", result)


result = timeUtil.first_day_of_next_month()
print("获取下月的第一天", result)
result = timeUtil.last_day_of_next_month()
print("获取下月的最后一天", result)



result = datetime.date(datetime.date.today().year, datetime.date.today().month + 2, 1)
print("测试 \a", result)

lst = ["\\", "|", "/", "-"]

for i in range(10):
    print("\r离程序退出还剩%s秒" % (9-i), end="")
    time.sleep(1)

# for i in range(20222):
#     j = i % 4
#     print("\r", lst[j], end="")
#     time.sleep(0.01)

for i in range(11):
    print("\r" + "■"*i, end=f"   {math.floor((i / 10) * 100)} %")
    time.sleep(0.2)



# # 获取当前时间
# localtime = time.localtime(time.time())
# print("本地时间为 :", localtime)
#
# # 获取格式化的时间
# localtime = time.asctime(time.localtime(time.time()) )
# print("本地时间为 :", localtime)
#
#
#
# # 格式化成2016-03-20 11:45:39形式
# print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
#
# # 格式化成Sat Mar 28 22:24:24 2016形式
# print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
#
# # 将格式字符串转换为时间戳
# a = "Sat Mar 28 22:24:24 2016"
# print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))
#
#
# print("time.altzone %d " % time.altzone)


